package main

import (
	"gitee.com/wu-jin-feng/kinfu/fgin"
	"github.com/gin-gonic/gin"
)

type testInput struct {
	Name string `json:"name" form:"name" validate:"required" label:"用户名" binding:"required" msg:"用户名错误"`
	Age  int    `json:"age" form:"age" validate:"gte=18" label:"年龄" binding:"gte=18" msg:"年龄错误"`
}

type test2Input struct {
	Name string `json:"name" form:"name" validate:"required" label:"用户名"`
	Age  int    `json:"age" form:"age" validate:"gte=18" label:"myAge"`
}

type test3Input struct {
	Name  string  `json:"name" form:"name" validate:"required" label:"用户名"`
	Age   int     `json:"age" form:"age" validate:"gte=18" label:"年龄"`
	Addr  Address `json:"addr" validate:"required" label:"地址"`
	Score []int   `json:"score" validate:"required"`
}

type Address struct {
	City string `json:"city" validate:"required"`
	Info string `json:"info" validate:"required"`
}

func main() {
	f := fgin.Fgin{}
	r := f.GetHttpServer("./test.yaml")
	// 测试接口1 测试原绑定方法，可以返回自定义错误
	r.GET("/test1", func(ctx *gin.Context) {
		input := &testInput{}
		if err := fgin.FbindParams(ctx, input); err != nil {
			fgin.ReturnJson(ctx, 400, nil, err)
			return
		}
		fgin.ReturnJson(ctx, 200, input, nil)
	})
	// 测试接口2 测试使用独立validate进行校验
	r.GET("/test2", func(ctx *gin.Context) {
		input := &test2Input{}
		if err := ctx.ShouldBind(input); err != nil {
			fgin.ReturnJson(ctx, 400, nil, err)
			return
		}
		if err := fgin.ValidateStruct(input); err != nil {
			fgin.ReturnJson(ctx, 400, nil, err)
			return
		}
		fgin.ReturnJson(ctx, 200, input, nil)
	})
	// 测试接口3  测试使用独立validate进行校验深层次校验
	r.POST("/test3", func(ctx *gin.Context) {
		input := &test3Input{}
		if err := ctx.ShouldBind(input); err != nil {
			fgin.ReturnJson(ctx, 400, nil, err)
			return
		}
		if err := fgin.ValidateStruct(input); err != nil {
			fgin.ReturnJson(ctx, 400, nil, err)
			return
		}
		fgin.ReturnJson(ctx, 200, input, nil)
	})
	// 测试接口2_1  测试使用独立validate进行校验和绑定参数
	r.GET("/test2_1", func(ctx *gin.Context) {
		input := &test2Input{}
		if err := fgin.ValidateBindParams(ctx, input); err != nil {
			fgin.ReturnJson(ctx, 400, nil, err)
			return
		}
		fgin.ReturnJson(ctx, 200, input, nil)
	})
	f.Run(r)
}
